package Hash;

import java.util.HashSet;
import java.util.LinkedList;

//快乐数
public class happy_number {
/*    快乐数 定义为：
    对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
    然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
    如果这个过程 结果为 1，那么这个数就是快乐数。
    如果 n 是 快乐数 就返回 true ；不是，则返回 false 。
*/

    /**
     *思路过程
     * 1.将该数进行拆分成个位数，如果该数是个位数且不是0.那么直接就不是快乐数
     * 2.如何进行拆分：取余，然后将其存储起来，然后进行平方
     * 结束条件：如果该数的结果是个位数且不是0，那么就不是快乐数
     */
    public static boolean isHappy_wrong(int n) {
        if(n==7){
            return true;
        }
        if(n<10&&n!=1){
            return false;
        }
        //因为这里如果用数组的话，得有长度，所以这里先用list进行存储
        //这里去得到n的各位数
        LinkedList list=new LinkedList();
        while (n>=1){
            int a=n%10;
            n=n/10;
            list.add(a);
        }
        //去计算结果
        int res=0;
        for (int i = 0; i < list.size(); i++) {
            int num= (int) list.get(i);
            res=res+num*num;
        }
        if(res==1){
            return true;
        }
        return isHappy_wrong(res);
    }
    /**
     *真正的思路过程：
     * 1.注意读题的提醒，要坚持每一句话都得读懂：
     *      重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
     * 这个无限循环的读题的意思是；如果数出现了循环仍然变不到1的话，那么就不可能是快乐数了，也就是说：结果不重复才有可能是快乐数【用set】
     *
     */
    public static boolean isHappy(int n) {
        //这里不使用递归了 利用while循环
        HashSet set=new HashSet();
        set.add(n);
        boolean judge_while=true;
        while (1==1){
            // 这里去判断结果n是不是1 如果是的话，则返回true
            if(n==1){
                return true;
            }
            //记录结果 得到新结果
            int res=0;
            while (n>=1){
                int a=n%10;
                n=n/10;
                res=res+a*a;
            }
            n=res;
            //如果包含了，就代表进入无限循环，且还没有找到，就是true了
            if(set.contains(n)){
                break;
            }
            set.add(n);
        }
        return false;
    }

    public static void main(String[] args) {
        System.out.println(isHappy(19));
    }
}
